package main

import (
	"fmt"
)

/*
给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数，其值等于另一个整数的平方；
换句话说，其值等于一个整数自乘的积。例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。
输入：n = 12
输出：3
解释：12 = 4 + 4 + 4
*/

func main() {
	n := 12

	fmt.Println(numSquares(n))
}

func numSquares(n int) int {
	dp := make([]int, n+1)
	for i := 1; i <= n; i++ { // 从 1~n
		dp[i] = i
		for j := 1; j*j <= i; j++ { // 求每个i的完全平方数的最小数量
			dp[i] = min(dp[i], dp[i-j*j]+1) // 数字i的最小数量 = min(当前i的最小数量, i-完全平方数j*j的最小数量+1)
		}
	}
	return dp[n]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
